const path = require("path");
const HtmlWebpackPlugin = require("html-webpack-plugin")
const {CleanWebpackPlugin} = require("clean-webpack-plugin")



const TerserPlugin  = require("terser-webpack-plugin")

const resolveApp = require("./paths")


module.exports =function (env){

    const isProduction = env.production
    // process.env.NODE_ENV = isProduction
    // node会将env的变量变成字符串
    process.env.production = isProduction

    return {
        mode:"production",
        context:path.resolve(__dirname,"../"),// 入口会根据这个context去解析,,如果不写，默认使用当前工作目录 ===》 项目的工作目录
        entry:{
            // 两个入口   手动将代码分离
            // main:{
            //     import:"./src/main.js",
            //     // dependOn:["lodash","dayjs"]
            //     dependOn:["shared"]
            // },
            main:"./src/main.js",
            index:"./src/index.js",
            // // lodash: "lodash",
            // // dayjs:"dayjs",
            // shared:["lodash","dayjs"]
        },
        output:{
            filename:"[name].bundle.js",// 一般自己写的才叫bundle，，， 加载的叫chunk
            path:resolveApp("./build"),
            chunkFilename:"[name].chunk.js" // 魔法注释设置名字
        },
        optimization:{
            minimizer:[// 对代码进行压缩
                new TerserPlugin({
                    extractComments:false  // 将
                })
            ],
            // natural ： 自然数  named:使用包所在目录作为名字   deterministic:生产环境推荐使用
            chunkIds:"deterministic",// name取名字的算法
            splitChunks:{
                // "initial" 同步导入    “all”：不管是异步还是同步
                chunks:"all", // 异步async，， 只有我的代码存在异步的，，才会去做一个分割
                minSize:20000, // 单位字节  20kb，，拆分的包最小大小
                maxSize:30000,// 将大于maxSize的包，拆分成不小于minSize的包，，，minSize的优先级，，大于maxSize优先级
                minChunks:1,// 表示引入的包，至少被引入了几次,,, 引入两次表示被两次复用
                cacheGroups:{
                    // 缓存组
                    vendor:{
                        // 从node_modules中加载
                        // 写一个路径,,, 不同操作系统斜杠不一样
                        test:/[\\/]node_modules[\\/]/,
                        filename:"[id]_vendors.js", // name不能用占位属性，，filename可以使用
                        priority:-20
                    },
                    // bar:{ // 将前面的minSize调下，不然不会被分离出去
                    //     test:/bar_/,
                    //     filename:"[id]_bar.js"
                    // }
                    default:{  // 如果既满足vendor又满足default，，通过优先级判断
                        minChunks:2, // 如果这个包被引入了两次，，，就打包成下面
                        filename:"common_[id].js",
                        priority:-10
                    }
                }
            }
        },
        module:{
            rules:[
                {
                    test:/\.jsx?$/,
                    use:["babel-loader"]
                }
            ]
        },
        resolve:{
            extensions:[".js",".json",".jsx"],
            alias:{
                "@":resolveApp("./src"),
                "pages":resolveApp("./src/pages")
            }
        },
        plugins:[
            new CleanWebpackPlugin(),// 生产环境
            new HtmlWebpackPlugin({
                template:"./index.html"
            })
        ]
    }
}
